// 引入其他类
import Food from './Food'
import Snake from './Snake'
import ScorePanel from './ScorePanel'


// 游戏控制器, 控制其他的所有类
class GameControl {
  // 定义三个属性
  food: Food
  snake: Snake
  scorePanel: ScorePanel

  // 创建一个属性来存储蛇的移动方向(按键方向)
  direction: string = ''
  // 创建一个属性用来记录游戏是否继续
  isLive = true
  constructor() {
    this.food = new Food()
    this.snake = new Snake()
    this.scorePanel = new ScorePanel(15,1)
    this.init()
  }
  init() {
    // 绑定键盘按键按下的事件
    document.addEventListener('keydown',this.keydownHandler.bind(this))
    // 调用run方法,使蛇移动
    this.run()
  }
  keydownHandler(event: KeyboardEvent) {
    // 需要检查event.key的值是否合法
    // 修改direction属性
    // console.log(event.key);
    
    this.direction = event.key
    
  }
  // 创建一个控制蛇移动的方法
  run() {
    /* 
    根据方向(this.direction)来使蛇的位置改变
    向上top 减少
    向下top 增加
    向左left 减少
    向右left 增加
    ArrowLeft
    ArrowDown
    ArrowUp
    ArrowRight
    */
    
    // 获取蛇现在的坐标
    let X = this.snake.X;
    let Y = this.snake.Y
    // 根据按键方向修改X值和Y值
    switch (this.direction) {
      case 'ArrowUp':
      case 'Up':
        Y -= 10
        break;
      case "ArrowDown":
      case "Down":
        Y += 10
        break;
      case "ArrowLeft":
      case "Left":
        X -= 10
        break;
      case "ArrowRight":
      case "Right":
        X += 10
        break;
    }
    // 检查蛇是否吃到了食物
    this.checkEat(X, Y)
    // console.log(X,Y);
    
    // 修改蛇的X值和Y值 

    try{
      this.snake.X = X;
      this.snake.Y = Y;
    }catch (e){
      // 进入catch,说明出现异常,游戏结束,弹出提示信息
      alert(e.message + '再接再厉')
      this.isLive = false
    }

    
    

    // 开启一个定时调用
    this.isLive && setTimeout(this.run.bind(this),300 - (this.scorePanel.level * 30))
  }

  // 定义一个方法,用来检查蛇是否迟到食物
  checkEat(X:number, Y:number) {
    if (X === this.food.X && Y === this.food.Y) {
      console.log('吃到食物了!');
      // 食物的位置要进行重置
      this.food.change()
      // 分数增加
      this.scorePanel.addScore();
      // 蛇要增加一节
      this.snake.addBody()
    }
  }
}

export default GameControl